Skip to content

feat: add lock / unlock functionality to agg_bridge for native miden assets#2771

Open
partylikeits1983 wants to merge 9 commits intoagglayerfrom
ajl-agg-bridge-lock-unlock
Open

feat: add lock / unlock functionality to agg_bridge for native miden assets#2771
partylikeits1983 wants to merge 9 commits intoagglayerfrom
ajl-agg-bridge-lock-unlock

Conversation

@partylikeits1983
Copy link
Copy Markdown
Contributor

@partylikeits1983 partylikeits1983 commented Apr 14, 2026

Closes #2700. Adds a lock/unlock path for Miden-native tokens to the AggLayer bridge, mirroring PolygonZkEVMBridgeV2.claimAsset()'s handling of originNetwork == networkID.

The bridge no longer needs to be the faucet's owner to support it, so user-created faucets are now bridgeable once the bridge admin registers them via a CONFIG_AGG_BRIDGE note with is_native = true. Registration is still admin-gated (register_faucet is caller-restricted); what changed is the ownership requirement.

Approach

Native faucet branch, end-to-end:

  • Bridge-out: if is_native, call lock_assetnative_account::add_asset to park the asset in the bridge's own vault. No BURN note is emitted.
  • Bridge-in: if is_native, call unlock_and_sendnative_account::remove_asset + p2id::new to emit a P2ID note to the recipient. No MINT note, no faucet ntx. PROOF_DATA_KEY is used as the serial number so the note commitment is deterministic per claim.
  • LET leaf construction and the existing non-native burn/mint flow are untouched.

Metadata moved to the bridge. All three FPI calls from the bridge into the faucet (asset_to_origin_asset, get_metadata_hash, get_scale) are replaced with bridge-local reads out of a new faucet_metadata_map.

A single map with four faucet-ID-keyed sub-keys holds everything:

Sub-key Value
[0, 0, fid_s, fid_p] [addr0, addr1, addr2, addr3]
[1, 0, fid_s, fid_p] [addr4, origin_network, scale, 0]
[2, 0, fid_s, fid_p] [mh_lo0..3]
[3, 0, fid_s, fid_p] [mh_hi0..3]

faucet_registry_map is extended from [1, 0, 0, 0] to [1, is_native, 0, 0], which is backward-compatible since existing entries have is_native = 0 implicitly. CONFIG_AGG_BRIDGE carries the full metadata payload at registration (split across two calls to fit the 16-element stack).

AggLayer faucet slimmed. With metadata on the bridge, the faucet's conversion-info / metadata-hash slots and its asset_to_origin_asset / get_metadata_hash / get_scale procs are dead code. Removed: the AggLayerFaucet component now only re-exports mint_and_send + burn on top of Ownable2Step + OwnerControlled. A Miden-native faucet which wants to integrate with Agglayer, now is just a plain network fungible faucet, no AggLayer-specific storage or FPI surface needed.

Follow-ups

Not in this PR; filing separately per @bobbinth's comments in the original issue for this PR:

@partylikeits1983 partylikeits1983 changed the title feat: add scale data to bridge storage feat: add lock / unlock functionality to agg_bridge for native miden assets Apr 16, 2026
@mmagician mmagician added agglayer PRs or issues related to AggLayer bridging integration pr-from-maintainers PRs that come from internal contributors or integration partners. They should be given priority labels Apr 16, 2026
Bumps rand 0.9.2 → 0.9.4 and rand 0.10.0 → 0.10.1 to resolve
RUSTSEC-2026-0097 flagged by `cargo deny check` in CI.
@partylikeits1983 partylikeits1983 marked this pull request as ready for review April 20, 2026 17:27
@partylikeits1983 partylikeits1983 self-assigned this Apr 20, 2026
Copy link
Copy Markdown
Contributor

@Fumuran Fumuran left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thank you!
It is a partial review, for now I only reviewed masm code. Mostly formatting suggestions and code optimizations

Comment on lines +117 to +118
#! 1. KEY [0, 0, fid_s, fid_p] -> [addr0, addr1, addr2, addr3] (origin address part 1)
#! 2. KEY [1, 0, fid_s, fid_p] -> [addr4, origin_network, scale, 0] (origin address part 2)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I'm not sure about fid abbreviation, it could be not immediately clear. I would vote for faucet_id_suffux and faucet_id_prefix

# Offset in the local memory of the `hash_token_address` procedure
const TOKEN_ADDR_HASH_PTR = 0

# Local memory offsets for `register_faucet`
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: it could be not clear whether the register_faucet is a procedure, storage slot or something else

Suggested change
# Local memory offsets for `register_faucet`
# Offsets in the local memory of the `register_faucet` procedure

Comment on lines +35 to +40
const REG_TOKEN_HASH_LOC = 0
const REG_FID_S_LOC = 4
const REG_FID_P_LOC = 5
const REG_SCALE_LOC = 6
const REG_ORIGIN_NETWORK_LOC = 7
const REG_IS_NATIVE_LOC = 8
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

optional nit: I would use more detailed names, though it is indeed not obvious how to express these pointers clearly but briefly

Comment on lines +163 to +167
movup.7 movup.7 movup.7 movup.7
# => [addr0, addr1, addr2, addr3, 0, 0, fid_s, fid_p, addr4, pad(11)]

swapw
# => [0, 0, fid_s, fid_p, addr0, addr1, addr2, addr3, addr4, pad(11)]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe that these lines could be removed

push.FAUCET_METADATA_MAP_SLOT[0..2]
exec.native_account::set_map_item
dropw
# => [addr4, pad(11)]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit:

    # => [addr4, pad(15)]

Comment on lines +105 to +107
# Drop the remaining pad to start fresh
dropw dropw dropw
# => []
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure that this will work, since we are in the note script

Comment on lines +129 to +135
# Pad to 16 (need 6 more zeros)
padw push.0.0
# => [0, 0, 0, 0, 0, 0, addr0, addr1, addr2, addr3, addr4, fid_s, fid_p, scale, origin_network, is_native]

# Load remaining origin_token_addr_[0..3] onto the stack
padw mem_loadw_le.ORIGIN_TOKEN_ADDR_0
# => [addr0, addr1, addr2, addr3, addr4, faucet_id_suffix, faucet_id_prefix, pad(13)]
# Move 6 pad zeros to the end
movdn.15 movdn.15 movdn.15 movdn.15 movdn.15 movdn.15
# => [addr0, addr1, addr2, addr3, addr4, fid_s, fid_p, scale, origin_network, is_native, pad(6)]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure that this is needed

Comment on lines +143 to +145
# Drop all 16 pad elements and rebuild the stack
dropw dropw dropw dropw
# => []
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above

Comment on lines +162 to +164
# Pad to 16 (need 6 more)
padw push.0.0
# => [0, 0, 0, 0, 0, 0, fid_s, fid_p, MH_LO, MH_HI]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same

call.bridge_config::store_faucet_metadata_hash
# => [pad(16)]

dropw dropw dropw dropw
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suppose this works only because we were explicitly padding to the 16 elements before call, but once everything else is updated, we should be able to remove this line

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agglayer PRs or issues related to AggLayer bridging integration pr-from-maintainers PRs that come from internal contributors or integration partners. They should be given priority

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants